﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using Lilium.Collections;
using System.Linq.Expressions;
using Lilium.Linq;

namespace Lilium.Web.Mvc
{
	/// <summary>
	/// Создает выражение для упорядочивания данных посредством обработки кликов на нажатие колонок.
	/// Один клик = упорядочивание по возрастанию. Клик по той же колонке - упорядочивание по убыванию, 
	/// клик по новой колонке - добавление нового выражения порядка в очередь.
	/// </summary>
	public class SortOrderExpressionBuilder
	{
		public SortOrderExpressionBuilder(ModelMetadata modelMetadata)
		{
			if (modelMetadata == null) throw new ArgumentNullException("modelMetadata");

			m_ModelMetadata = modelMetadata;
			m_PropertyQueue = new CyclicQueue<string>(modelMetadata.Properties.Count());
		}

		public void ColumnCommand(string propertyPath)
		{	
			if (propertyPath == null) throw new ArgumentNullException("propertyName");

			//PropertyQueue.Enqueue( ModelMetadata.ModelType. );
			/*
			if (ModelMetadata.Properties.FirstOrDefault(p => p.PropertyName == propertyPath) == null)
				throw new ArgumentException(string.Format("Property {0} not found in model {1}", propertyPath, ModelMetadata.DisplayName));
			PropertyQueue.Enqueue(propertyPath);*/
		}

		private Expression BuildMemberAccessExpression(IEnumerator<string> chain, ModelMetadata ModelMetadata)
		{
			if (chain.MoveNext())
			{
				if (ModelMetadata.Properties.FirstOrDefault(p => p.PropertyName == chain.Current) == null)
					throw new ArgumentException(string.Format("Property {0} not found in model {1}", chain.Current, ModelMetadata.DisplayName));
			}
			throw new NotImplementedException();
		}

		#region private CyclicQueue<string> PropertyQueue

		private readonly CyclicQueue<string> m_PropertyQueue;

		private CyclicQueue<string> PropertyQueue
		{
			get
			{
				return m_PropertyQueue;
			}
		}

		#endregion

		#region private ModelMetadata ModelMetadata

		private readonly ModelMetadata m_ModelMetadata;

		private ModelMetadata ModelMetadata
		{
			get
			{
				return m_ModelMetadata;
			}
		}

		#endregion
	}
}